– Introducción a R - Manejar Datos –



“Herramientas de análisis cuantitativo y su aplicación en la conservación de la biodiversidad”


Este taller ha sido desarrollado por:


1. Objetivos de Aprendizaje

Al final de este taller, podrás aprender cómo:

  • Agrupar y resumir datos usando el paquete dplyr.
  • Usar las funciones mutate(), filter(), select(), group_by() y summarise() del paquete “dplyr” para modificar estructuras de datos.
  • Usar las funciones group_by() y summarise() para analizar estructuras de datos.
  • Cargar datos en varios formatos.
  • Usar las funciones pivot_longer() y pivot_wider() del paquete tidyr para modificar la disposición de estructuras de datos. Usar las funciones str_replace() y str_remove() del paquete stringr para manipular caracteres en estructuras de datos.

2. Para Empezar

¿Qué es necesario para limpiar datos en R y por que es importante?

En el taller de visualización, hablamos sobre la importancia de crear gráficos que resuenen con tu audiencia y reflejen tu mensaje deseado. Ahora que sabemos cómo lograr esto, es importante aprender a manipular datos para reflejar nuestro mensaje deseado.

Los datos vienen en muchos tipos de formas y lo que es útil o práctico para una aplicación no necesariamente funcionaría para otra. R tiene requisitos específicos sobre la configuración y los tipos de datos que se pueden pasar entre las funciones. Entonces, es muy importante tener la habilidad de manipular tus datos y darles la forma necesaria. Algunas de las funciones de las que hablaremos en este taller tienen el poder de manipular estructuras de datos mediante filtrado, reorganización y acomodo de caracteres.

¿Qué es necesario para manipular datos en R?

Ahora, vamos a instalar los paquetes que vamos a usar en este taller. Para empezar, vamos a instalar los paquetes dplyr, tidyr y stringr. Solo es necesario hacer esto una vez, ya que los paquetes se guardarán automáticamente en la sección “Packages” en RStudio. Los paquetes te dan acceso a todas las funciones creadas por el usuario y se pueden instalar usando la siguiente línea de código:

install.packages('dplyr')
install.packages('tidyr')
install.packages('stringr')

Cuando los paquetes terminen de instalarse, aparecerá un mensaje indicando que los paquetes fueron instalados con éxito!

3. dplyr

dplyr es un paquete útil para reorganizar, modificar y manipular datos. Es posible que utilices este paquete con frecuencia en sus proyectos. Por favor, carga este paquete en R usando library(). Ahora, vamos a hablar de cinco funciones específicas en el paquete dplyr: filter(), mutate(), select(), group_by() y summarise().

Tips!

Recuerda que cada vez que abras R de nuevo y desees utilizar el paquete dplyr, debes cargarlo usando la función library().

library(dplyr)
library(tidyr)
library(stringr)
library(ggplot2)

Sin embargo, antes de adentrarnos en los detalles de cómo aplicar estas funciones, necesitamos una base de datos. En este caso, nuestra estructura de datos se llama “butterfly” y contiene datos cualitativos de una población de mariposas atlánticas en Brazil Pereira et al. 2018.

En preparación para los ejemplos siguientes, por favor carga los datos “ATLANTIC_BUTTERFLIES_sites.csv” en R y asígnalos a un objeto con el nombre “butterfly”.

butterfly <- read.csv2("ATLANTIC_BUTTERFLIES_sites.csv")
butterfly
sites_ID Country State Municipality Study.Location Latitude Longitude Precision Reserve_Area Altitude Altitude1km A_mean_temp A_rainfall Olsong200r Olsoneconame Ribeirovegtype BSRs
bor1001 Brazil RIO GRANDE DO SUL MAQUINE Maquine -29.58333333 -50.26666667 13000 NA 100-300 305 18.68 1568 Atlantic Forests Araucaria moist forests Floresta Ombrofila Mista Florestas de Araucaria
bor1002 Brazil RIO GRANDE DO SUL SAO FRANCISCO DE PAULA Floresta Nacional de Sao Francisco de Paula -29.423669 -50.386914 2200 1615 900 917 14.94 2083 Atlantic Forests Araucaria moist forests Estepe Florestas de Araucaria
bor1003 Brazil RIO GRANDE DO SUL SANTA MARIA Santa Maria -29.747514 -53.838197 30 NA 50-100 99 19.86 1665 NA Uruguayan savanna Areas de Tensao Ecologica Florestas de Interior
bor1004 Brazil PARANA CURITIBA Curitiba -25.3 -49.36666667 12000 NA 850-1000 956 16.69 1641 Atlantic Forests Araucaria moist forests Floresta Ombrofila Mista Florestas de Araucaria
bor1005 Brazil PARANA LONDRINA Londrina -23.306445 -51.170618 Not Precise NA 500-600 571 20.65 1598 Atlantic Forests Alto Parana Atlantic forests Floresta Estacional Semidecidual Florestas de Interior

3.1 dplyr::filter() - filtrando datos basado en criteros

Una de las funciones más útiles de dplyr es filter(). Con esta función, es posible filtrar observaciones específicas basándose en las entradas en una o más columnas.

La base de datos nos muestra la columna “número de sitio” (sites_ID) tiene varios tipos diferentes de “números de sitio”.

¿Qué pasaría si quisiéramos crear una estructura de datos que solo incluya las observaciones del sitio “bor1001”?

Esto es cuando utilizaríamos la función filter() en la siguiente línea de código:

filter(butterfly, sites_ID == "bor1001")
sites_ID Country State Municipality Study.Location Latitude Longitude Precision Reserve_Area Altitude Altitude1km A_mean_temp A_rainfall Olsong200r Olsoneconame Ribeirovegtype BSRs
bor1001 Brazil RIO GRANDE DO SUL MAQUINE Maquine -29.58333333 -50.26666667 13000 NA 100-300 305 18.68 1568 Atlantic Forests Araucaria moist forests Floresta Ombrofila Mista Florestas de Araucaria

Además, es posible filtrar observaciones numéricamente. Por ejemplo, para obtener una estructura de datos que contenga todos los sitios donde la precipitación fué de más de 1000 mm de lluvia. Para esoto utilizaremos la siguiente línea de código. Presta atención a que cuando filtras por número, no es necesario poner comillas al número.

filter(butterfly, A_rainfall >= 1000)
sites_ID Country State Municipality Study.Location Latitude Longitude Precision Reserve_Area Altitude Altitude1km A_mean_temp A_rainfall Olsong200r Olsoneconame Ribeirovegtype BSRs
bor1001 Brazil RIO GRANDE DO SUL MAQUINE Maquine -29.58333333 -50.26666667 13000 NA 100-300 305 18.68 1568 Atlantic Forests Araucaria moist forests Floresta Ombrofila Mista Florestas de Araucaria
bor1002 Brazil RIO GRANDE DO SUL SAO FRANCISCO DE PAULA Floresta Nacional de Sao Francisco de Paula -29.423669 -50.386914 2200 1615 900 917 14.94 2083 Atlantic Forests Araucaria moist forests Estepe Florestas de Araucaria
bor1003 Brazil RIO GRANDE DO SUL SANTA MARIA Santa Maria -29.747514 -53.838197 30 NA 50-100 99 19.86 1665 NA Uruguayan savanna Areas de Tensao Ecologica Florestas de Interior
bor1004 Brazil PARANA CURITIBA Curitiba -25.3 -49.36666667 12000 NA 850-1000 956 16.69 1641 Atlantic Forests Araucaria moist forests Floresta Ombrofila Mista Florestas de Araucaria
bor1005 Brazil PARANA LONDRINA Londrina -23.306445 -51.170618 Not Precise NA 500-600 571 20.65 1598 Atlantic Forests Alto Parana Atlantic forests Floresta Estacional Semidecidual Florestas de Interior

Finalmente, es posible usar un número infinito de condiciones para filtrar la estructura de datos, todo dentro de la misma línea de código. Por ejemplo, si quisieras crear una estructura de datos que contenga solamente los sitios en Río de Janeiro donde cayó más de 1000 mm de lluvia, usarías esta línea de código:

filter(butterfly, State == "RIO DE JANEIRO", A_rainfall >= 1000)
sites_ID Country State Municipality Study.Location Latitude Longitude Precision Reserve_Area Altitude Altitude1km A_mean_temp A_rainfall Olsong200r Olsoneconame Ribeirovegtype BSRs
bor1018 Brazil RIO DE JANEIRO ITATIAIA Paque Nacional do Itatiaia -22.375278 -44.662222 9000 28086.06751 2000-2600 2534 9.39 2300 Atlantic Forests Campos Rupestres montane savanna Floresta Ombrofila Densa Florestas de Interior
bor1019 Brazil RIO DE JANEIRO GUAPIMIRIM Guapimirim -22.49305556 -42.94916667 30 NA 50-250 305 22 1441 Atlantic Forests Serra do Mar coastal forests Floresta Ombrofila Densa Serra do Mar
bor1020 Brazil RIO DE JANEIRO CACHOEIRAS DE MACACU Reserva Ecologica de Guapiacu -22.45388889 -42.77166667 30 7.385 30-180 120 22.85 1284 Atlantic Forests Serra do Mar coastal forests Floresta Ombrofila Densa Serra do Mar
bor1021 Brazil RIO DE JANEIRO CACHOEIRAS DE MACACU Boca do Mato -22.40583333 -42.60694444 30 NA 200-450 488 20.28 1277 Atlantic Forests Serra do Mar coastal forests Floresta Ombrofila Densa Serra do Mar
bor1022 Brazil RIO DE JANEIRO PETROPOLIS Independencia and Alto Xerem and Petropolis -22.54416667 -43.20472222 30 NA 900-1000 592 18.38 1867 Atlantic Forests Serra do Mar coastal forests Floresta Ombrofila Densa Serra do Mar

Ten en cuenta que las funciones que hemos aplicado no han modificado la estructura de datos “butterfly”. Puede confirmar esto ejecutando esta linea de código:

butterfly
sites_ID Country State Municipality Study.Location Latitude Longitude Precision Reserve_Area Altitude Altitude1km A_mean_temp A_rainfall Olsong200r Olsoneconame Ribeirovegtype BSRs
bor1001 Brazil RIO GRANDE DO SUL MAQUINE Maquine -29.58333333 -50.26666667 13000 NA 100-300 305 18.68 1568 Atlantic Forests Araucaria moist forests Floresta Ombrofila Mista Florestas de Araucaria
bor1002 Brazil RIO GRANDE DO SUL SAO FRANCISCO DE PAULA Floresta Nacional de Sao Francisco de Paula -29.423669 -50.386914 2200 1615 900 917 14.94 2083 Atlantic Forests Araucaria moist forests Estepe Florestas de Araucaria
bor1003 Brazil RIO GRANDE DO SUL SANTA MARIA Santa Maria -29.747514 -53.838197 30 NA 50-100 99 19.86 1665 NA Uruguayan savanna Areas de Tensao Ecologica Florestas de Interior
bor1004 Brazil PARANA CURITIBA Curitiba -25.3 -49.36666667 12000 NA 850-1000 956 16.69 1641 Atlantic Forests Araucaria moist forests Floresta Ombrofila Mista Florestas de Araucaria
bor1005 Brazil PARANA LONDRINA Londrina -23.306445 -51.170618 Not Precise NA 500-600 571 20.65 1598 Atlantic Forests Alto Parana Atlantic forests Floresta Estacional Semidecidual Florestas de Interior

Para guardar las modificaciones de la estructura de datos, se debe asignar la función a un objeto. Por ejemplo:

butterfly_modified <- filter(butterfly, sites_ID == "bor1122")
butterfly_modified
sites_ID Country State Municipality Study.Location Latitude Longitude Precision Reserve_Area Altitude Altitude1km A_mean_temp A_rainfall Olsong200r Olsoneconame Ribeirovegtype BSRs
bor1122 Brazil BAHIA CRUZ DAS ALMAS Campus da Universidade Federal do Reconcavo Baiano -12.65 -39.11666667 Not Precise NA 220 139 23.14 1078 Atlantic Forests Bahia interior forests Floresta Estacional Semidecidual Diamantina

Compara los dos ejemplos.

Para recordar

La función filter() filtrará en el orden en que los elementos son listados en la función. Por ejemplo, para la línea de código abajo, R filtrará por “estado” (State) y luego por “cantidad de lluvia” (A_rainfall). Con esta información, presta atención al orden de los elementos para filtrar tus datos de la manera que desees.

Información!

3.2 dplyr::select() - modificando estructaras de datos basado en nombre de las columnas

Otra función importante es la función select(). Esta función es particularmente útil cuando estás trabajando con estructuras de datos extensas. Específicamente, la función select() te permite seleccionar una o más columnas de tu estructura de datos y transferirlas a una nueva estructura de datos.

Por ejemplo, imagina que deseas crear una estructura de datos que contenga solamente las columnas “numero de sitio” (sites_ID) y “estado” (State) de la estructura de datos original, “butterfly”. Puedes lograr esto utilizando la siguiente línea de código:

select(butterfly,sites_ID, State)
sites_ID State
bor1001 RIO GRANDE DO SUL
bor1002 RIO GRANDE DO SUL
bor1003 RIO GRANDE DO SUL
bor1004 PARANA
bor1005 PARANA

Información!

Las diferentes columnas que seleccionaste están dividas entre comas y los nombres de las columnas tienen que tener los mismos nombres de la estructura de datos original (esto incluye el uso de mayúsculas, espacios, guiones,periodos, etc).

Esta función es similar al uso del símbolo $ porque ambas te permiten examinar una parte específica de la estructura de datos.

butterfly$sites_ID
##   [1] "bor1001" "bor1002" "bor1003" "bor1004" "bor1005" "bor1006" "bor1007"
##   [8] "bor1008" "bor1009" "bor1010" "bor1011" "bor1012" "bor1013" "bor1014"
##  [15] "bor1015" "bor1016" "bor1017" "bor1018" "bor1019" "bor1020" "bor1021"
##  [22] "bor1022" "bor1023" "bor1024" "bor1025" "bor1026" "bor1027" "bor1028"
##  [29] "bor1029" "bor1030" "bor1031" "bor1032" "bor1033" "bor1034" "bor1035"
##  [36] "bor1036" "bor1037" "bor1038" "bor1039" "bor1040" "bor1041" "bor1042"
##  [43] "bor1043" "bor1044" "bor1045" "bor1046" "bor1047" "bor1048" "bor1049"
##  [50] "bor1050" "bor1051" "bor1052" "bor1053" "bor1054" "bor1055" "bor1056"
##  [57] "bor1057" "bor1058" "bor1059" "bor1060" "bor1061" "bor1062" "bor1063"
##  [64] "bor1064" "bor1065" "bor1066" "bor1067" "bor1068" "bor1069" "bor1070"
##  [71] "bor1071" "bor1072" "bor1073" "bor1074" "bor1075" "bor1076" "bor1077"
##  [78] "bor1078" "bor1079" "bor1080" "bor1081" "bor1082" "bor1083" "bor1084"
##  [85] "bor1085" "bor1086" "bor1087" "bor1088" "bor1089" "bor1090" "bor1091"
##  [92] "bor1092" "bor1093" "bor1094" "bor1095" "bor1096" "bor1097" "bor1098"
##  [99] "bor1099" "bor1100" "bor1101" "bor1102" "bor1103" "bor1104" "bor1105"
## [106] "bor1106" "bor1107" "bor1108" "bor1109" "bor1110" "bor1111" "bor1112"
## [113] "bor1113" "bor1114" "bor1115" "bor1116" "bor1117" "bor1118" "bor1119"
## [120] "bor1120" "bor1121" "bor1122"

Compare el uso de $ y la función select()

Si planillas a crear una estructura de datos que contiene la mayoría de columnas de la estructura original, puede ser tedioso a listar todos los nombres de las columnas. Afortunadamente, la función select() permite quitar columnas usando el símbolo “-”. Ahora, imagine que queremos a crear una estructura de datos que contiene todas las columnas de la original “butterfly” estructura excluyendo “numero de sitio” (sites_ID) y “estado” (State) utilizáramos la siguiente linea de código:

select(butterfly,-sites_ID, -State)
Country Municipality Study.Location Latitude Longitude Precision Reserve_Area Altitude Altitude1km A_mean_temp A_rainfall Olsong200r Olsoneconame Ribeirovegtype BSRs
Brazil MAQUINE Maquine -29.58333333 -50.26666667 13000 NA 100-300 305 18.68 1568 Atlantic Forests Araucaria moist forests Floresta Ombrofila Mista Florestas de Araucaria
Brazil SAO FRANCISCO DE PAULA Floresta Nacional de Sao Francisco de Paula -29.423669 -50.386914 2200 1615 900 917 14.94 2083 Atlantic Forests Araucaria moist forests Estepe Florestas de Araucaria
Brazil SANTA MARIA Santa Maria -29.747514 -53.838197 30 NA 50-100 99 19.86 1665 NA Uruguayan savanna Areas de Tensao Ecologica Florestas de Interior
Brazil CURITIBA Curitiba -25.3 -49.36666667 12000 NA 850-1000 956 16.69 1641 Atlantic Forests Araucaria moist forests Floresta Ombrofila Mista Florestas de Araucaria
Brazil LONDRINA Londrina -23.306445 -51.170618 Not Precise NA 500-600 571 20.65 1598 Atlantic Forests Alto Parana Atlantic forests Floresta Estacional Semidecidual Florestas de Interior

Finalmente, imagina que quieres crear una estructura de datos que contenga columnas que estén agrupadas en la estructura original. En este caso, puedes usar el símbolo “:” para ahorrar tiempo al escribir todos los nombres de las columnas. Por ejemplo, presta atención a la estructura “butterfly” e imagina que quieres crear una nueva estructura de datos que contenga las primeras cuatro columnas de la estructura “butterfly”, desde “numero de sitio” (sites_ID) hasta “altitud” (altitude). Para lograr esto, puedes utilizar la siguiente línea de código:

select(butterfly, sites_ID:Altitude)
sites_ID Country State Municipality Study.Location Latitude Longitude Precision Reserve_Area Altitude
bor1001 Brazil RIO GRANDE DO SUL MAQUINE Maquine -29.58333333 -50.26666667 13000 NA 100-300
bor1002 Brazil RIO GRANDE DO SUL SAO FRANCISCO DE PAULA Floresta Nacional de Sao Francisco de Paula -29.423669 -50.386914 2200 1615 900
bor1003 Brazil RIO GRANDE DO SUL SANTA MARIA Santa Maria -29.747514 -53.838197 30 NA 50-100
bor1004 Brazil PARANA CURITIBA Curitiba -25.3 -49.36666667 12000 NA 850-1000
bor1005 Brazil PARANA LONDRINA Londrina -23.306445 -51.170618 Not Precise NA 500-600

Para recordar

3.3 dplyr::mutate - agregando columnas a estructuras de datos

La función mutate() se utiliza para agregar columnas a una estructura de datos existente. La nueva columna generalmente es una función de una o más de las columnas existentes. Por ejemplo, imagina que quieres añadir una columna a la estructura “butterfly” que sea igual al logaritmo de la columna “A_rainfall”. Esta acción se puede realizar de dos maneras.

Primero, puedes crear una nueva estructura de datos que incluya todas las columnas presentes en la estructura original de “butterfly”, con la nueva adición.

mutate(butterfly, Log_Rainfall = log(A_rainfall))
sites_ID Country State Municipality Study.Location Latitude Longitude Precision Reserve_Area Altitude Altitude1km A_mean_temp A_rainfall Olsong200r Olsoneconame Ribeirovegtype BSRs Log_Rainfall
bor1001 Brazil RIO GRANDE DO SUL MAQUINE Maquine -29.58333333 -50.26666667 13000 NA 100-300 305 18.68 1568 Atlantic Forests Araucaria moist forests Floresta Ombrofila Mista Florestas de Araucaria 7.357556
bor1002 Brazil RIO GRANDE DO SUL SAO FRANCISCO DE PAULA Floresta Nacional de Sao Francisco de Paula -29.423669 -50.386914 2200 1615 900 917 14.94 2083 Atlantic Forests Araucaria moist forests Estepe Florestas de Araucaria 7.641564
bor1003 Brazil RIO GRANDE DO SUL SANTA MARIA Santa Maria -29.747514 -53.838197 30 NA 50-100 99 19.86 1665 NA Uruguayan savanna Areas de Tensao Ecologica Florestas de Interior 7.417580
bor1004 Brazil PARANA CURITIBA Curitiba -25.3 -49.36666667 12000 NA 850-1000 956 16.69 1641 Atlantic Forests Araucaria moist forests Floresta Ombrofila Mista Florestas de Araucaria 7.403061
bor1005 Brazil PARANA LONDRINA Londrina -23.306445 -51.170618 Not Precise NA 500-600 571 20.65 1598 Atlantic Forests Alto Parana Atlantic forests Floresta Estacional Semidecidual Florestas de Interior 7.376508

También es posible añadir más de una columna a una estructura de datos utilizando la siguiente línea de código:

mutate(butterfly, Log_Rainfall = log(A_rainfall), climate_index = A_mean_temp * A_rainfall)

En esta linea de código, añadimos dos columnas, la columna previa que toma el logaritmo de la columna “A_rainfall” y una nueva columna, “climate_index”, que calcula el indice de clima con multiplicar las columnas “A_rainfall” y “A_mean_temp”.

Que pasa cuando ejecutas la linea de codigo previa?

R indica un error al calcular el índice climático debido a que la columna de temperatura, “A_mean_temp”, no es numérica.

Para examinar la estructura de datos “butterfly”, recuerda que es posible utilizar la función str():

str(butterfly)
## 'data.frame':    122 obs. of  17 variables:
##  $ sites_ID      : chr  "bor1001" "bor1002" "bor1003" "bor1004" ...
##  $ Country       : chr  "Brazil" "Brazil" "Brazil" "Brazil" ...
##  $ State         : chr  "RIO GRANDE DO SUL" "RIO GRANDE DO SUL" "RIO GRANDE DO SUL" "PARANA" ...
##  $ Municipality  : chr  "MAQUINE" "SAO FRANCISCO DE PAULA" "SANTA MARIA" "CURITIBA" ...
##  $ Study.Location: chr  "Maquine" "Floresta Nacional de Sao Francisco de Paula" "Santa Maria" "Curitiba" ...
##  $ Latitude      : chr  "-29.58333333" "-29.423669" "-29.747514" "-25.3" ...
##  $ Longitude     : chr  "-50.26666667" "-50.386914" "-53.838197" "-49.36666667" ...
##  $ Precision     : chr  "13000" "2200" "30" "12000" ...
##  $ Reserve_Area  : chr  NA "1615" NA NA ...
##  $ Altitude      : chr  "100-300" "900" "50-100" "850-1000" ...
##  $ Altitude1km   : int  305 917 99 956 571 936 442 280 139 803 ...
##  $ A_mean_temp   : chr  "18.68" "14.94" "19.86" "16.69" ...
##  $ A_rainfall    : int  1568 2083 1665 1641 1598 1691 1256 1202 1763 1431 ...
##  $ Olsong200r    : chr  "Atlantic Forests" "Atlantic Forests" NA "Atlantic Forests" ...
##  $ Olsoneconame  : chr  "Araucaria moist forests" "Araucaria moist forests" "Uruguayan savanna" "Araucaria moist forests" ...
##  $ Ribeirovegtype: chr  "Floresta Ombrofila Mista" "Estepe" "Areas de Tensao Ecologica" "Floresta Ombrofila Mista" ...
##  $ BSRs          : chr  "Florestas de Araucaria" "Florestas de Araucaria" "Florestas de Interior" "Florestas de Araucaria" ...

Al usar la función str(), podemos confirmar que la columna “A_mean_temp” está clasificada como un carácter en lugar de ser numérica:

Entonces, para realizar la operación de multiplicación y calcular el índice climático, debemos cambiar la columna “A_mean_temp” a formato numérico utilizando la siguiente línea de código:

butterfly <- mutate(butterfly, A_mean_temp = as.numeric(A_mean_temp))

mutate(butterfly, Log_Rainfall = log(A_rainfall), climate_index = A_mean_temp * A_rainfall)
sites_ID Country State Municipality Study.Location Latitude Longitude Precision Reserve_Area Altitude Altitude1km A_mean_temp A_rainfall Olsong200r Olsoneconame Ribeirovegtype BSRs Log_Rainfall climate_index
bor1001 Brazil RIO GRANDE DO SUL MAQUINE Maquine -29.58333333 -50.26666667 13000 NA 100-300 305 18.68 1568 Atlantic Forests Araucaria moist forests Floresta Ombrofila Mista Florestas de Araucaria 7.357556 29290.24
bor1002 Brazil RIO GRANDE DO SUL SAO FRANCISCO DE PAULA Floresta Nacional de Sao Francisco de Paula -29.423669 -50.386914 2200 1615 900 917 14.94 2083 Atlantic Forests Araucaria moist forests Estepe Florestas de Araucaria 7.641564 31120.02
bor1003 Brazil RIO GRANDE DO SUL SANTA MARIA Santa Maria -29.747514 -53.838197 30 NA 50-100 99 19.86 1665 NA Uruguayan savanna Areas de Tensao Ecologica Florestas de Interior 7.417580 33066.90
bor1004 Brazil PARANA CURITIBA Curitiba -25.3 -49.36666667 12000 NA 850-1000 956 16.69 1641 Atlantic Forests Araucaria moist forests Floresta Ombrofila Mista Florestas de Araucaria 7.403061 27388.29
bor1005 Brazil PARANA LONDRINA Londrina -23.306445 -51.170618 Not Precise NA 500-600 571 20.65 1598 Atlantic Forests Alto Parana Atlantic forests Floresta Estacional Semidecidual Florestas de Interior 7.376508 32998.70

Para recordar

3.4 dplyr::group_by - categorizando una estructura de datos por nombre de columnas

Continuaremos explorando más funciones del paquete dplyr. En esta ocasión, utilizaremos la función group_by(). Esta función es útil cuando tienes dos variables categóricas y deseas analizar cuántos elementos pertenecen a cada grupo en una u otra categoría. La función group_by() crea una estructura de datos que reorganiza la estructura original basándose en columnas específicas.

Esta función es especialmente útil cuando se combina con la función summarise(), de la cual aprenderemos más en la siguiente sección.

Grouped_Sites <- group_by(butterfly, sites_ID)
Grouped_Sites
## # A tibble: 122 × 17
## # Groups:   sites_ID [122]
##    sites_ID Country State         Municipality Study.Location Latitude Longitude
##    <chr>    <chr>   <chr>         <chr>        <chr>          <chr>    <chr>    
##  1 bor1001  Brazil  RIO GRANDE D… MAQUINE      Maquine        -29.583… -50.2666…
##  2 bor1002  Brazil  RIO GRANDE D… SAO FRANCIS… Floresta Naci… -29.423… -50.3869…
##  3 bor1003  Brazil  RIO GRANDE D… SANTA MARIA  Santa Maria    -29.747… -53.8381…
##  4 bor1004  Brazil  PARANA        CURITIBA     Curitiba       -25.3    -49.3666…
##  5 bor1005  Brazil  PARANA        LONDRINA     Londrina       -23.306… -51.1706…
##  6 bor1006  Brazil  PARANA        GUARAPUAVA   Guarapuava     -25.402… -51.4211…
##  7 bor1007  Brazil  PARANA        MARINGA      Maringa        -23.435… -51.9430…
##  8 bor1008  Brazil  PARANA        DIAMANTE DO… Estacao Ecolo… -22.618… -52.8566…
##  9 bor1009  Brazil  RIO GRANDE D… PORTO MAUA   Porto Maua     -27.516… -54.6666…
## 10 bor1010  Brazil  PARANA        BALSA NOVA   Sao Luiz do P… -25.760… -50.1777…
## # ℹ 112 more rows
## # ℹ 10 more variables: Precision <chr>, Reserve_Area <chr>, Altitude <chr>,
## #   Altitude1km <int>, A_mean_temp <dbl>, A_rainfall <int>, Olsong200r <chr>,
## #   Olsoneconame <chr>, Ribeirovegtype <chr>, BSRs <chr>

Para recordar

3.5 dplyr::summarise() - agregando columnas sumadas a estructuras de datos

Ahora, retomaremos la función summarise() que mencionamos en la sección anterior. Esta función calcula una estadística específica en las columnas indicadas en tu línea de código y guarda estos valores en una nueva columna que se agrega a tu estructura de datos. Cuando se utilizan las funciones summarise() y group_by() juntas, la estadística se calcula para cada grupo. Por ejemplo, contaremos el número de ocurrencias en cada grupo de nuestra estructura de datos “butterfly” utilizando la función n().

Fijese que estamos combinando dos funciones, la función group_by (agrupe la columna Estado) dentro de la función summarise() (cuente el numero de occurencias).

summarise(group_by(butterfly, State), n())
State n()
ALAGOAS 2
BAHIA 11
ESPIRITO SANTO 9
GOIAS 2
MATO GROSSO DO SUL 2

El siguiente ejmeplo puede mostrar mejor el potentical de esta función. Vamos a agrupar por Estado (“State”) y cálculamos el promedio de lluvia.

Aquí agrupamos por Estado y lo guardamos en el objeto Group_State, después empujamos este objeto con el operador %>% hacia la otra función summarise.

Grouped_State <- group_by(butterfly, State)%>%
  summarise(mean(A_rainfall))
Grouped_State
State mean(A_rainfall)
ALAGOAS 1814.000
BAHIA 1229.818
ESPIRITO SANTO 1237.667
GOIAS 1604.000
MATO GROSSO DO SUL 1217.500

Para recordar

4. tidyr

tidyr es otro paquete que puede ayudar al usuario a manipular una estructura de datos. El paquete tidyr es especialmente útil para transformar una estructura de datos de un formato largo a un formato ancho, y viceversa.

Formato largo y ancho!! ¿Qué es esto? Veamos:

Información!

Una estructura de datos en formato largo contiene valores que no se repiten en la primera columna. En cambio, una estructura de datos en formato ancho contiene valores que se repiten en la primera columna. Por ejemplo, considera las dos estructuras de datos que contienen los mismos datos pero en diferentes formatos:

Pero, ¿Por qué es importante manipular una estructura de datos de esta manera?

Los paquetes “ggplot” y “ggplot2”, que utilizamos en el taller anterior para crear gráficos, prefieren visualizar una estructura de datos en formato largo en lugar de formato ancho.

Recuerda que cada vez que abras R de nuevo y desees utilizar el paquete tidyr, debes cargarlo usando la función library().

library(tidyr)

4.1 tidyr::pivot_longer() - modificando estructuras de datos a formato larga

La primera función importante del paquete tidyr es pivot_longer(). Esta función cambia el formato de una estructura de datos, aumentando el número de filas y reduciendo el número de columnas, creando una estructura de datos en formato largo.

Vamos a utilizar la estructura de datos sin modificar, “polar”, del taller anterior para explorar esta función. Recuerda cargar la estructura de datos usando la siguiente línea.

Revise la estructura de esta base de datos. Es un poco rara la estructura de la base de datos, pero esta es la realidad con todas las bases de datos.

Hay muchas columnas (144), la mayoría parece ser especies pero los nombres son un poco confusos. Por ejemplo “T..melanophris……Black.browed.albatross.”, parece que los autores incluyeron el nombre científico y despues de los puntos ….. el nombre común en inglés.

polar <- read.delim("ANT-XXVIII_5_seabirds_marine_mammals.tab", skip = 154)
polar
ID..Consecutive.number.of.transec…. Date.Time..Starting.time..UTC..of.30.min…. Latitude..Mid.latitude.of.30.min.transe…. Longitude..Mid.longitude.of.30.min.trans…. Bathy.depth..m…Mid.mean.water.depth.of.30.mi…. Speed..kn…Average.speed.of.the.vessel.d…. Distance..km…Distance.covered.during.30.mi…. Sal..Mid.mean.surface.salinity.of….. Temp…C…Mid.mean.surface.water.temper…. F.chl..µg.l…Mid.fluorescence.of.30.min.tr…. Zone..Zones..which.were.defined.on….. E..chrysocome……Rockhopper.penguin. S..magellanicus……Magellanic.penguin. Penguins……Penguin.sp.. T..melanophris……Black.browed.albatross. T..cauta……Shy.albatross. T..chlororhynchos……Atlantic.yellow.nosed.albatross. D..exulans……Wandering.albatross. D..dabbenena……Tristan.albatross. Diomedea.sp…….Great.albatrosses.sp.. D..epomophora……Southern.royal.albatross. D..sanfordi……Northern.royal.albatross. D..epomophora……including.Diomedea.sanfordi. Albatrosses……Albatross.sp.. M..giganteus……Southern.giant.petrel. Macronectes.sp…….Giant.petrel.sp.. F..glacialis……Northern.fulmar. D..capense……Cape.petrel. P..macroptera……Great.winged.petrel. P..feae……Fea.s.petrel. P..incerta……Atlantic.petrel. P..arminjoniana……Trinidade.petrel. P..mollis……Soft.plumaged.petrel. B..bulwerii……Bulwer.s.petrel. P..aequinoctialis……White.chinned.petrel. P..conspicillata……Spectacled.petrel. Petrels……Petrel.sp.. Pachyptila.sp…….including.Halobaena.sp.. C..diomedea……Cory.s.shearwater. C..edwardsii……Cape.Verde.shearwater. P..gravis……Great.shearwater. P..griseus……Sooty.shearwater. P..puffinus……Manx.shearwater. P..mauretanicus……Balearic.shearwater. P..baroli……Macaronesian.shearwater. P..lherminieri……Audubon.s.shearwater. P..assimilis……Little.shearwater. Shearwaters……Shearwater.sp.. O..oceanicus……Wilson.s.storm.petrel. G..nereis……Grey.backed.storm.petrel. P..marina……White.faced.storm.petrel. F..grallaria……White.bellied.storm.petrel. O..castro……Madeiran.storm.petrel. O..leucorhoa……Leach.s.storm.petrel. O..castro……including.Oceanodroma.leucorhoa. H..pelagicus……European.storm.petrel. Storm.petrels……Storm.petrel.sp.. P..aethereus……Red.billed.tropicbird. P..lepturus……White.tailed.tropicbird. Tropicbirds……Tropicbird.sp.. F..aquila……Ascension.frigatebird. F..magnificens……Magnificent.frigatebird. M..bassanus……Northern.gannet. S..capensis……Cape.gannet. S..sula……Red.footed.booby. S..leucogaster……Brown.booby. C..skua……Great.skua. C..maccormicki……South.polar.skua. C..antarctica……Antarctic.skua. S..pomarinus……Pomarine.skua. S..parasiticus……Arctic.skua. S..longicaudus……Long.tailed.skua. Skuas……Skua.sp.. B..bernicla……Brent.goose. G..arctica……Black.throated.diver. P..capensis……Cape.cormorant. P..coronatus……Crowned.cormorant. P..carbo……Great.cormorant. P..magellani……Magellanic.diving.petrel. Pelecanoides.sp…….Diving.petrel.sp.. P..fulicarius……Red.phalarope. L..canus……Common.gull. L..melanocephalus……Mediteranean.gull. L..argentatus……Herring.gull. L..fuscus……Lesser.black.backed.gull. L..michahellis……Yellow.legged.gull. L..dominicanus……Cape.gull. L..marinus……Great.black.backed.gull. L..ridibundus……Black.headed.gull. L..minutus……Little.gull. R..tridactyla……Black.legged.kittiwake. X..sabini……Sabine.s.gull. Gulls……Gull.sp.. S..hirundo……Common.tern. S..arctica……Arctic.tern. S..dougallii……Roseate.tern. S..anaethetus……Bridled.tern. S..fuscata……Sooty.tern. S..sandvicensis……Sandwich.tern. T..maximus……Royal.tern. C..niger……Black.tern. T..bergii……Crested.tern. Terns……Tern.sp.. A..stolidus……Brown.noddy. U..aalge……Guillemot. A..torda……Razorbill. Alcidae.sp…….Alcidae.sp.. Seabird.unident……Seabird..unidentified. P..catodon……Sperm.whale. M..novaeangliae……Humpback.whale. B..physalus……Fin.whale. B..borealis……Sei.whale. B..acutorostrata……Minke.whale. B..brydei……Bryde.s.whale. G..melas……Long.finned.pilot.whale. G..macrorhynchus……Short.finned.pilot.whale. Globicephala.sp…….Pilot.whale.sp.. Z..cavirostris……Cuvier.s.beaked.whale. Beaked.whale……Beaked.whale.sp.. Whale.unident……Whale..unidentified. O..orca……Killer.whale. L..australis……Peale.s.dolphin. L..albirostris……White.beacked.dolphin. Lagenorhynchus.sp…….Lagenorhynchus.sp.. D..delphis……Common.dolphin. S..frontalis……Atlantic.spotted.dolphin. S..coeruleoalba……Striped.dolphin. S..clymene……Clymene.dolphin. T..truncatus……Bottlenose.dolphin. G..griseus……Risso.s.dolphin. S..bredanensis……Rough.toothed.dolphin. S..longirostris……Spinner.dolphin. Dolphin.unident……Dolphin..unidentified. P..phocoena……Harbour.porpoise. A..pusillus……South.African.fur.seal. C..caretta……Loggerhead.sea.turtle. C..mydas……Green.sea.turtle. D..coriacea……Leatherback.sea.turtle. Sea.turtles……Sea.turtle.sp.. Manta.sp…….Manta.ray. Ray……Ray. Hammerhead.shark……Hammerhead.shark. Shark……Shark. Mola.mola……Sun.fish.
1 2012-04-11T13:30 -51.48 -66.86 108 8.8 8.1488 32.9347 8.3860 5.35 10 0 0 0 16 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 9 0 0 0 0 0 38 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
2 2012-04-11T14:00 -51.41 -66.80 115 9.3 8.6118 32.9383 8.2629 5.49 10 0 0 0 7 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 29 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
3 2012-04-11T14:30 -51.34 -66.74 124 9.4 8.7044 32.9225 8.4985 5.49 10 0 0 0 14 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 0 0 0 0 0 32 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
4 2012-04-11T15:00 -51.28 -66.67 117 9.2 8.5192 32.9378 8.4757 5.75 10 0 0 0 13 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 0 0 0 0 0 22 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
5 2012-04-11T15:30 -51.21 -66.61 123 5.7 5.2782 32.9560 8.2094 5.80 10 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 297 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

La idea es que los nombres no esten en columnas sino que los organizemos en filas en una columna que llamemos “Especies”. Y los valores que tiene cada especie en una columna que llamemos “Abundancia”.

Para manipular la estructura de datos “polar” a formato largo, puedes utilizar la siguiente línea de código.

¿Cuántas columnas hay ahora? ¿Cuantas filas hay? ¿Por qué tantas? este es el formato largo al que haciamos referencia

polar_longer <- pivot_longer(polar, # base de datos
                             names_to = "Especies", # la columna que crearemos para incluir todas las especies 
                             values_to = "Abundance", # la columna que crearemos para adicionar los valores de abundancia de cada especie
                             cols = `E..chrysocome......Rockhopper.penguin.`:`Mola.mola......Sun.fish.` # Las columnas que deseas incluir, aquí utilizamos todas las especies entonces la primera especie y la última separadas de ":"
                             )
polar_longer
ID..Consecutive.number.of.transec…. Date.Time..Starting.time..UTC..of.30.min…. Latitude..Mid.latitude.of.30.min.transe…. Longitude..Mid.longitude.of.30.min.trans…. Bathy.depth..m…Mid.mean.water.depth.of.30.mi…. Speed..kn…Average.speed.of.the.vessel.d…. Distance..km…Distance.covered.during.30.mi…. Sal..Mid.mean.surface.salinity.of….. Temp…C…Mid.mean.surface.water.temper…. F.chl..µg.l…Mid.fluorescence.of.30.min.tr…. Zone..Zones..which.were.defined.on….. Especies Abundance
1 2012-04-11T13:30 -51.48 -66.86 108 8.8 8.1488 32.9347 8.386 5.35 10 E..chrysocome……Rockhopper.penguin. 0
1 2012-04-11T13:30 -51.48 -66.86 108 8.8 8.1488 32.9347 8.386 5.35 10 S..magellanicus……Magellanic.penguin. 0
1 2012-04-11T13:30 -51.48 -66.86 108 8.8 8.1488 32.9347 8.386 5.35 10 Penguins……Penguin.sp.. 0
1 2012-04-11T13:30 -51.48 -66.86 108 8.8 8.1488 32.9347 8.386 5.35 10 T..melanophris……Black.browed.albatross. 16
1 2012-04-11T13:30 -51.48 -66.86 108 8.8 8.1488 32.9347 8.386 5.35 10 T..cauta……Shy.albatross. 0

Veamos cuantos nombres de especies diferentes hay:

unique(polar_longer$Especies)
##   [1] "E..chrysocome......Rockhopper.penguin."                 
##   [2] "S..magellanicus......Magellanic.penguin."               
##   [3] "Penguins......Penguin.sp.."                             
##   [4] "T..melanophris......Black.browed.albatross."            
##   [5] "T..cauta......Shy.albatross."                           
##   [6] "T..chlororhynchos......Atlantic.yellow.nosed.albatross."
##   [7] "D..exulans......Wandering.albatross."                   
##   [8] "D..dabbenena......Tristan.albatross."                   
##   [9] "Diomedea.sp.......Great.albatrosses.sp.."               
##  [10] "D..epomophora......Southern.royal.albatross."           
##  [11] "D..sanfordi......Northern.royal.albatross."             
##  [12] "D..epomophora......including.Diomedea.sanfordi."        
##  [13] "Albatrosses......Albatross.sp.."                        
##  [14] "M..giganteus......Southern.giant.petrel."               
##  [15] "Macronectes.sp.......Giant.petrel.sp.."                 
##  [16] "F..glacialis......Northern.fulmar."                     
##  [17] "D..capense......Cape.petrel."                           
##  [18] "P..macroptera......Great.winged.petrel."                
##  [19] "P..feae......Fea.s.petrel."                             
##  [20] "P..incerta......Atlantic.petrel."                       
##  [21] "P..arminjoniana......Trinidade.petrel."                 
##  [22] "P..mollis......Soft.plumaged.petrel."                   
##  [23] "B..bulwerii......Bulwer.s.petrel."                      
##  [24] "P..aequinoctialis......White.chinned.petrel."           
##  [25] "P..conspicillata......Spectacled.petrel."               
##  [26] "Petrels......Petrel.sp.."                               
##  [27] "Pachyptila.sp.......including.Halobaena.sp.."           
##  [28] "C..diomedea......Cory.s.shearwater."                    
##  [29] "C..edwardsii......Cape.Verde.shearwater."               
##  [30] "P..gravis......Great.shearwater."                       
##  [31] "P..griseus......Sooty.shearwater."                      
##  [32] "P..puffinus......Manx.shearwater."                      
##  [33] "P..mauretanicus......Balearic.shearwater."              
##  [34] "P..baroli......Macaronesian.shearwater."                
##  [35] "P..lherminieri......Audubon.s.shearwater."              
##  [36] "P..assimilis......Little.shearwater."                   
##  [37] "Shearwaters......Shearwater.sp.."                       
##  [38] "O..oceanicus......Wilson.s.storm.petrel."               
##  [39] "G..nereis......Grey.backed.storm.petrel."               
##  [40] "P..marina......White.faced.storm.petrel."               
##  [41] "F..grallaria......White.bellied.storm.petrel."          
##  [42] "O..castro......Madeiran.storm.petrel."                  
##  [43] "O..leucorhoa......Leach.s.storm.petrel."                
##  [44] "O..castro......including.Oceanodroma.leucorhoa."        
##  [45] "H..pelagicus......European.storm.petrel."               
##  [46] "Storm.petrels......Storm.petrel.sp.."                   
##  [47] "P..aethereus......Red.billed.tropicbird."               
##  [48] "P..lepturus......White.tailed.tropicbird."              
##  [49] "Tropicbirds......Tropicbird.sp.."                       
##  [50] "F..aquila......Ascension.frigatebird."                  
##  [51] "F..magnificens......Magnificent.frigatebird."           
##  [52] "M..bassanus......Northern.gannet."                      
##  [53] "S..capensis......Cape.gannet."                          
##  [54] "S..sula......Red.footed.booby."                         
##  [55] "S..leucogaster......Brown.booby."                       
##  [56] "C..skua......Great.skua."                               
##  [57] "C..maccormicki......South.polar.skua."                  
##  [58] "C..antarctica......Antarctic.skua."                     
##  [59] "S..pomarinus......Pomarine.skua."                       
##  [60] "S..parasiticus......Arctic.skua."                       
##  [61] "S..longicaudus......Long.tailed.skua."                  
##  [62] "Skuas......Skua.sp.."                                   
##  [63] "B..bernicla......Brent.goose."                          
##  [64] "G..arctica......Black.throated.diver."                  
##  [65] "P..capensis......Cape.cormorant."                       
##  [66] "P..coronatus......Crowned.cormorant."                   
##  [67] "P..carbo......Great.cormorant."                         
##  [68] "P..magellani......Magellanic.diving.petrel."            
##  [69] "Pelecanoides.sp.......Diving.petrel.sp.."               
##  [70] "P..fulicarius......Red.phalarope."                      
##  [71] "L..canus......Common.gull."                             
##  [72] "L..melanocephalus......Mediteranean.gull."              
##  [73] "L..argentatus......Herring.gull."                       
##  [74] "L..fuscus......Lesser.black.backed.gull."               
##  [75] "L..michahellis......Yellow.legged.gull."                
##  [76] "L..dominicanus......Cape.gull."                         
##  [77] "L..marinus......Great.black.backed.gull."               
##  [78] "L..ridibundus......Black.headed.gull."                  
##  [79] "L..minutus......Little.gull."                           
##  [80] "R..tridactyla......Black.legged.kittiwake."             
##  [81] "X..sabini......Sabine.s.gull."                          
##  [82] "Gulls......Gull.sp.."                                   
##  [83] "S..hirundo......Common.tern."                           
##  [84] "S..arctica......Arctic.tern."                           
##  [85] "S..dougallii......Roseate.tern."                        
##  [86] "S..anaethetus......Bridled.tern."                       
##  [87] "S..fuscata......Sooty.tern."                            
##  [88] "S..sandvicensis......Sandwich.tern."                    
##  [89] "T..maximus......Royal.tern."                            
##  [90] "C..niger......Black.tern."                              
##  [91] "T..bergii......Crested.tern."                           
##  [92] "Terns......Tern.sp.."                                   
##  [93] "A..stolidus......Brown.noddy."                          
##  [94] "U..aalge......Guillemot."                               
##  [95] "A..torda......Razorbill."                               
##  [96] "Alcidae.sp.......Alcidae.sp.."                          
##  [97] "Seabird.unident......Seabird..unidentified."            
##  [98] "P..catodon......Sperm.whale."                           
##  [99] "M..novaeangliae......Humpback.whale."                   
## [100] "B..physalus......Fin.whale."                            
## [101] "B..borealis......Sei.whale."                            
## [102] "B..acutorostrata......Minke.whale."                     
## [103] "B..brydei......Bryde.s.whale."                          
## [104] "G..melas......Long.finned.pilot.whale."                 
## [105] "G..macrorhynchus......Short.finned.pilot.whale."        
## [106] "Globicephala.sp.......Pilot.whale.sp.."                 
## [107] "Z..cavirostris......Cuvier.s.beaked.whale."             
## [108] "Beaked.whale......Beaked.whale.sp.."                    
## [109] "Whale.unident......Whale..unidentified."                
## [110] "O..orca......Killer.whale."                             
## [111] "L..australis......Peale.s.dolphin."                     
## [112] "L..albirostris......White.beacked.dolphin."             
## [113] "Lagenorhynchus.sp.......Lagenorhynchus.sp.."            
## [114] "D..delphis......Common.dolphin."                        
## [115] "S..frontalis......Atlantic.spotted.dolphin."            
## [116] "S..coeruleoalba......Striped.dolphin."                  
## [117] "S..clymene......Clymene.dolphin."                       
## [118] "T..truncatus......Bottlenose.dolphin."                  
## [119] "G..griseus......Risso.s.dolphin."                       
## [120] "S..bredanensis......Rough.toothed.dolphin."             
## [121] "S..longirostris......Spinner.dolphin."                  
## [122] "Dolphin.unident......Dolphin..unidentified."            
## [123] "P..phocoena......Harbour.porpoise."                     
## [124] "A..pusillus......South.African.fur.seal."               
## [125] "C..caretta......Loggerhead.sea.turtle."                 
## [126] "C..mydas......Green.sea.turtle."                        
## [127] "D..coriacea......Leatherback.sea.turtle."               
## [128] "Sea.turtles......Sea.turtle.sp.."                       
## [129] "Manta.sp.......Manta.ray."                              
## [130] "Ray......Ray."                                          
## [131] "Hammerhead.shark......Hammerhead.shark."                
## [132] "Shark......Shark."                                      
## [133] "Mola.mola......Sun.fish."

Ahora lo que podemos hacer es encontrar la media de la abundancia por especie.

¿Recuerda cómo hacerlo?

polar_longer_mean <- summarise(group_by(polar_longer, by = Especies), mean(Abundance))

polar_longer_mean
by mean(Abundance)
A..pusillus……South.African.fur.seal. 0.0000000
A..stolidus……Brown.noddy. 0.0000000
A..torda……Razorbill. 0.0000000
Albatrosses……Albatross.sp.. 0.0778626
Alcidae.sp…….Alcidae.sp.. 0.0000000

Gráfiquemos los datos:

polar_longer_mean2 <- subset(polar_longer_mean, polar_longer_mean$`mean(Abundance)`>0.1) # removamos datos menores a 0.1 para poder visualizar las especies de mayor abundancia

ggplot(polar_longer_mean2, aes(x= polar_longer_mean2$`mean(Abundance)`, y = reorder(polar_longer_mean2$by, -polar_longer_mean2$`mean(Abundance)`)))+
  geom_bar(stat = 'identity', fill="lightblue",  orientation = "y")+
  xlab("Abundance")+
  ylab("Especies")

Para recordar

4.2 tidyr::pivot_wider() - modificando estructuras de datos a formato ancho

La segunda función de la que hablaremos es el inverso de la primera función. El inverso de pivot_longer es pivot_wider. Esta función manipula la estructura de datos al formato ancho, aumentando el número de columnas y reduciendo el número de filas.

Para manipular la estructura de datos “polar_longer” al formato ancho, puedes utilizar la siguiente línea de código:

polar_wider <- pivot_wider(polar_longer, names_from = 'Especies', values_from = 'Abundance')
polar_wider
ID..Consecutive.number.of.transec…. Date.Time..Starting.time..UTC..of.30.min…. Latitude..Mid.latitude.of.30.min.transe…. Longitude..Mid.longitude.of.30.min.trans…. Bathy.depth..m…Mid.mean.water.depth.of.30.mi…. Speed..kn…Average.speed.of.the.vessel.d…. Distance..km…Distance.covered.during.30.mi…. Sal..Mid.mean.surface.salinity.of….. Temp…C…Mid.mean.surface.water.temper…. F.chl..µg.l…Mid.fluorescence.of.30.min.tr…. Zone..Zones..which.were.defined.on….. E..chrysocome……Rockhopper.penguin. S..magellanicus……Magellanic.penguin. Penguins……Penguin.sp.. T..melanophris……Black.browed.albatross. T..cauta……Shy.albatross. T..chlororhynchos……Atlantic.yellow.nosed.albatross. D..exulans……Wandering.albatross. D..dabbenena……Tristan.albatross. Diomedea.sp…….Great.albatrosses.sp.. D..epomophora……Southern.royal.albatross. D..sanfordi……Northern.royal.albatross. D..epomophora……including.Diomedea.sanfordi. Albatrosses……Albatross.sp.. M..giganteus……Southern.giant.petrel. Macronectes.sp…….Giant.petrel.sp.. F..glacialis……Northern.fulmar. D..capense……Cape.petrel. P..macroptera……Great.winged.petrel. P..feae……Fea.s.petrel. P..incerta……Atlantic.petrel. P..arminjoniana……Trinidade.petrel. P..mollis……Soft.plumaged.petrel. B..bulwerii……Bulwer.s.petrel. P..aequinoctialis……White.chinned.petrel. P..conspicillata……Spectacled.petrel. Petrels……Petrel.sp.. Pachyptila.sp…….including.Halobaena.sp.. C..diomedea……Cory.s.shearwater. C..edwardsii……Cape.Verde.shearwater. P..gravis……Great.shearwater. P..griseus……Sooty.shearwater. P..puffinus……Manx.shearwater. P..mauretanicus……Balearic.shearwater. P..baroli……Macaronesian.shearwater. P..lherminieri……Audubon.s.shearwater. P..assimilis……Little.shearwater. Shearwaters……Shearwater.sp.. O..oceanicus……Wilson.s.storm.petrel. G..nereis……Grey.backed.storm.petrel. P..marina……White.faced.storm.petrel. F..grallaria……White.bellied.storm.petrel. O..castro……Madeiran.storm.petrel. O..leucorhoa……Leach.s.storm.petrel. O..castro……including.Oceanodroma.leucorhoa. H..pelagicus……European.storm.petrel. Storm.petrels……Storm.petrel.sp.. P..aethereus……Red.billed.tropicbird. P..lepturus……White.tailed.tropicbird. Tropicbirds……Tropicbird.sp.. F..aquila……Ascension.frigatebird. F..magnificens……Magnificent.frigatebird. M..bassanus……Northern.gannet. S..capensis……Cape.gannet. S..sula……Red.footed.booby. S..leucogaster……Brown.booby. C..skua……Great.skua. C..maccormicki……South.polar.skua. C..antarctica……Antarctic.skua. S..pomarinus……Pomarine.skua. S..parasiticus……Arctic.skua. S..longicaudus……Long.tailed.skua. Skuas……Skua.sp.. B..bernicla……Brent.goose. G..arctica……Black.throated.diver. P..capensis……Cape.cormorant. P..coronatus……Crowned.cormorant. P..carbo……Great.cormorant. P..magellani……Magellanic.diving.petrel. Pelecanoides.sp…….Diving.petrel.sp.. P..fulicarius……Red.phalarope. L..canus……Common.gull. L..melanocephalus……Mediteranean.gull. L..argentatus……Herring.gull. L..fuscus……Lesser.black.backed.gull. L..michahellis……Yellow.legged.gull. L..dominicanus……Cape.gull. L..marinus……Great.black.backed.gull. L..ridibundus……Black.headed.gull. L..minutus……Little.gull. R..tridactyla……Black.legged.kittiwake. X..sabini……Sabine.s.gull. Gulls……Gull.sp.. S..hirundo……Common.tern. S..arctica……Arctic.tern. S..dougallii……Roseate.tern. S..anaethetus……Bridled.tern. S..fuscata……Sooty.tern. S..sandvicensis……Sandwich.tern. T..maximus……Royal.tern. C..niger……Black.tern. T..bergii……Crested.tern. Terns……Tern.sp.. A..stolidus……Brown.noddy. U..aalge……Guillemot. A..torda……Razorbill. Alcidae.sp…….Alcidae.sp.. Seabird.unident……Seabird..unidentified. P..catodon……Sperm.whale. M..novaeangliae……Humpback.whale. B..physalus……Fin.whale. B..borealis……Sei.whale. B..acutorostrata……Minke.whale. B..brydei……Bryde.s.whale. G..melas……Long.finned.pilot.whale. G..macrorhynchus……Short.finned.pilot.whale. Globicephala.sp…….Pilot.whale.sp.. Z..cavirostris……Cuvier.s.beaked.whale. Beaked.whale……Beaked.whale.sp.. Whale.unident……Whale..unidentified. O..orca……Killer.whale. L..australis……Peale.s.dolphin. L..albirostris……White.beacked.dolphin. Lagenorhynchus.sp…….Lagenorhynchus.sp.. D..delphis……Common.dolphin. S..frontalis……Atlantic.spotted.dolphin. S..coeruleoalba……Striped.dolphin. S..clymene……Clymene.dolphin. T..truncatus……Bottlenose.dolphin. G..griseus……Risso.s.dolphin. S..bredanensis……Rough.toothed.dolphin. S..longirostris……Spinner.dolphin. Dolphin.unident……Dolphin..unidentified. P..phocoena……Harbour.porpoise. A..pusillus……South.African.fur.seal. C..caretta……Loggerhead.sea.turtle. C..mydas……Green.sea.turtle. D..coriacea……Leatherback.sea.turtle. Sea.turtles……Sea.turtle.sp.. Manta.sp…….Manta.ray. Ray……Ray. Hammerhead.shark……Hammerhead.shark. Shark……Shark. Mola.mola……Sun.fish.
1 2012-04-11T13:30 -51.48 -66.86 108 8.8 8.1488 32.9347 8.3860 5.35 10 0 0 0 16 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 9 0 0 0 0 0 38 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
2 2012-04-11T14:00 -51.41 -66.80 115 9.3 8.6118 32.9383 8.2629 5.49 10 0 0 0 7 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 29 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
3 2012-04-11T14:30 -51.34 -66.74 124 9.4 8.7044 32.9225 8.4985 5.49 10 0 0 0 14 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 0 0 0 0 0 32 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
4 2012-04-11T15:00 -51.28 -66.67 117 9.2 8.5192 32.9378 8.4757 5.75 10 0 0 0 13 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 0 0 0 0 0 22 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
5 2012-04-11T15:30 -51.21 -66.61 123 5.7 5.2782 32.9560 8.2094 5.80 10 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 297 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

Para recordar

5. stringr

Por último, otro paquete útil cuando se trabaja con datos, especialmente cuando se trabaja con caracteres o “strings”, es “stringr”. Este paquete puede manipular caracteres individuales dentro de un vector de caracteres, anidar o eliminar espacios en blanco e identificar patrones en un vector de caracteres.

Información!

Las funciones del paquete “stringr” comienzan con “str_”, lo cual puede ser similar a la función str() que discutimos en el taller anterior. Sin embargo, no hay relación entre estas funciones, ya que str() muestra la estructura de un conjunto de datos.

Tips!

Recuerda que cada vez que abras R de nuevo y desees usar el paquete “stringr”, debes cargarlo usando la función library().

library(stringr)

En la siguiente parte del taller, vamos a usar el conjunto de datos “parrot”. La diferencia es que estos datos son la versión original y sin modificaciones de “parrot_clean” del taller previo.

Empezamos cargando los datos y asignándolos al objeto “parrot”.

Luego creemos un objeto (vector) con los nombres de las columnas.

parrot <- read.delim("Ferrer-Paris_2013.tab", skip = 27)
colnames_parrot <- colnames(parrot)
colnames_parrot
##  [1] "Longitude"           "Latitude"            "Code"               
##  [4] "Time..min."          "Date.Time"           "A..amazonica...."   
##  [7] "A..autumnalis...."   "A..barbadensis...."  "A..dufresniana...." 
## [10] "A..farinosa...."     "A..festiva...."      "A..mercenaria...."  
## [13] "A..ochrocephala...."

5.1 stringr::str_replace() - reemplazar characteres en estructuras de datos

La primera función del paquete “stringr” de la que hablaremos es str_replace(). Esta función es importante cuando se desea reemplazar caracteres específicos en una estructura de datos.

En la estructura de datos “parrot”, los nombres de las especies están separados por puntos. Por ejemplo, el nombre de la primera especie está escrito como “A..Amazonica….”. Vamos a utilizar la siguiente línea de código para reemplazar el primer par de puntos con un guion bajo:

parrot_replace <- str_replace(colnames_parrot, # vector con nombre de las columnas
                              "\\.\\.", # patrón que queremos reemplazar
                              "_" # con qué lo queremos reemplazar
                              )
parrot_replace
##  [1] "Longitude"          "Latitude"           "Code"              
##  [4] "Time_min."          "Date.Time"          "A_amazonica...."   
##  [7] "A_autumnalis...."   "A_barbadensis...."  "A_dufresniana...." 
## [10] "A_farinosa...."     "A_festiva...."      "A_mercenaria...."  
## [13] "A_ochrocephala...."

5.2 stringr::str_remove() - eliminar characteres en estructura de datos

Similar a str_replace(), la función str_remove() permite quitar caracteres específicos de una estructura de datos. Ahora que hemos reemplazado el primer grupo de puntos con un guion bajo, vamos a utilizar la función str_remove() para eliminar el segundo grupo de puntos al final del nombre de las especies. Usaremos la siguiente línea de código:

parrot_remove <- str_remove(parrot_replace, "\\.\\.\\.\\.")
parrot_remove
##  [1] "Longitude"      "Latitude"       "Code"           "Time_min."     
##  [5] "Date.Time"      "A_amazonica"    "A_autumnalis"   "A_barbadensis" 
##  [9] "A_dufresniana"  "A_farinosa"     "A_festiva"      "A_mercenaria"  
## [13] "A_ochrocephala"

Para recordar

Ahora que hemos limpiado los nombres de las columnas, podemos reemplazar los nombres en la estructura de datos (recuerda que extraemos los nombres cuando realizamos cambios) utilizando la siguiente línea de código:

colnames(parrot) <- parrot_remove
parrot
Longitude Latitude Code Time_min. Date.Time A_amazonica A_autumnalis A_barbadensis A_dufresniana A_farinosa A_festiva A_mercenaria A_ochrocephala
-72.54740 10.31623 NM05 3 2010-03-15T11:13 0 0 0 0 0 0 0 0
-72.54267 10.31252 NM05 3 2010-03-15T11:06 0 0 0 0 0 0 0 0
-72.53757 10.31035 NM05 3 2010-03-15T10:59 0 0 0 0 0 0 0 0
-72.53145 10.30940 NM05 3 2010-03-15T10:54 0 0 0 0 0 0 0 0
-72.52523 10.30667 NM05 3 2010-03-15T10:46 0 0 0 0 0 0 0 0

Información!

Al utilizar las funciones del paquete stringr, es importante tener en cuenta que los ejemplos de las dos funciones anteriores solo ejecutan el comando para la primera ocurrencia. Para aplicar el comando a todas las ocurrencias, el usuario debe agregar “_all” a la línea de código.

Consulta la solución del ejercicio cinco para un ejemplo de cómo realizar los cambios en los nombres en un solo paso utilizando str_remove_all().

6. Ayuda en la web

Si necesitas más información sobre las funciones de los paquetes mencionados, puedes consultar la documentación en línea:

A continuación, te presento unos ejercicios para poner en práctica lo aprendido:

7. Practica!

Ejercicio 1

¿Cuáles son las funciones de las diferentes partes de esta línea de código? Nota: en R Studio utiliza la ayuda para la función filter() en el paquete dplyr.

Haz clic aquí para solucion!

A. El objeto conteniendo los datos

B. Expresiónes que entregan “True” o “False”

Ejercicio 2

Usando la estructura de datos “parrot_data”, agrega una columna que muestre la suma de las abundancias para cada especie. Verifica que la columna fue añadida usando la función head().

Haz clic aquí para solucion!
parrot_data <- read.csv("venezuelan_parrots_wide.csv")

parrot_data_total <- parrot_data %>% 
  group_by(site) %>% 
  summarise_all(sum) %>%
  rowwise() %>%
  mutate(total_abundance = sum(c_across(A_amazonica:A_ochrocephala)) )

head(parrot_data_total)
## # A tibble: 6 × 6
## # Rowwise: 
##   site  A_amazonica A_barbadensis A_farinosa A_ochrocephala total_abundance
##   <chr>       <int>         <int>      <int>          <int>           <int>
## 1 NM01            0             0          0              0               0
## 2 NM02            0             0          0              0               0
## 3 NM03            1             0          0              3               4
## 4 NM05            0             0         10             11              21
## 5 NM07            4             0          2              8              14
## 6 NM08            8             0          0              2              10

Ejercicio 3

Primero, utilizando la estructura de datos “butterfly”, agrupa la estructura de datos por “estado” (state) y suma los valores obtenidos por el número de ocurrencias. Segundo, visualiza los datos modificados en forma de un gráfico de barras mostrando el número de ocurrencias por estado.

Haz clic aquí para solución!
butterfly_state <- butterfly %>%
  group_by(State) %>% 
  summarise(n_spe = n())

ggplot(data = butterfly_state, aes(x = State, y = n_spe)) + geom_bar(stat = "identity")

En el gráfico resultante, vemos que es difícil leer los nombres en el axis horizontal. Para corregir esto,es posible utilizar la adición a el código siguiente:

 ggplot(data = butterfly_state, aes(x = State, y = n_spe)) + geom_bar(stat = "identity") +
  theme(axis.text = element_text(angle = 90))

Ejercicio 4

Utilizando la estructura de datos “polar”, crea un nuevo objeto llamado “high_temp” utilizando la función filter() para demostrar todas las temperaturas mayores a 23 grados Celsius. Luego, utiliza la función mutate() para crear una nueva columna con valores de “Verdadero/Falso” y ejecuta el comando anterior. Pista: utiliza la función mutate() para crear una nueva columna.

Haz clic aquí para solución!
str(polar)
## 'data.frame':    655 obs. of  144 variables:
##  $ ID..Consecutive.number.of.transec....                  : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ Date.Time..Starting.time..UTC..of.30.min....           : chr  "2012-04-11T13:30" "2012-04-11T14:00" "2012-04-11T14:30" "2012-04-11T15:00" ...
##  $ Latitude..Mid.latitude.of.30.min.transe....            : num  -51.5 -51.4 -51.3 -51.3 -51.2 ...
##  $ Longitude..Mid.longitude.of.30.min.trans....           : num  -66.9 -66.8 -66.7 -66.7 -66.6 ...
##  $ Bathy.depth..m...Mid.mean.water.depth.of.30.mi....     : int  108 115 124 117 123 121 122 121 122 NA ...
##  $ Speed..kn...Average.speed.of.the.vessel.d....          : num  8.8 9.3 9.4 9.2 5.7 9.7 9.3 9.2 9.9 9.8 ...
##  $ Distance..km...Distance.covered.during.30.mi....       : num  8.15 8.61 8.7 8.52 5.28 ...
##  $ Sal..Mid.mean.surface.salinity.of.....                 : num  32.9 32.9 32.9 32.9 33 ...
##  $ Temp...C...Mid.mean.surface.water.temper....           : num  8.39 8.26 8.5 8.48 8.21 ...
##  $ F.chl..µg.l...Mid.fluorescence.of.30.min.tr....        : num  5.35 5.49 5.49 5.75 5.8 6.01 6.14 6.5 6.61 6.91 ...
##  $ Zone..Zones..which.were.defined.on.....                : int  10 10 10 10 10 10 10 10 10 10 ...
##  $ E..chrysocome......Rockhopper.penguin.                 : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ S..magellanicus......Magellanic.penguin.               : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ Penguins......Penguin.sp..                             : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ T..melanophris......Black.browed.albatross.            : int  16 7 14 13 1 8 0 7 2 1 ...
##  $ T..cauta......Shy.albatross.                           : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ T..chlororhynchos......Atlantic.yellow.nosed.albatross.: int  0 0 0 0 0 0 0 0 0 0 ...
##  $ D..exulans......Wandering.albatross.                   : int  0 0 0 0 0 1 0 0 0 0 ...
##  $ D..dabbenena......Tristan.albatross.                   : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ Diomedea.sp.......Great.albatrosses.sp..               : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ D..epomophora......Southern.royal.albatross.           : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ D..sanfordi......Northern.royal.albatross.             : int  0 2 0 0 0 0 0 0 0 0 ...
##  $ D..epomophora......including.Diomedea.sanfordi.        : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ Albatrosses......Albatross.sp..                        : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ M..giganteus......Southern.giant.petrel.               : int  0 0 0 0 0 0 1 2 0 2 ...
##  $ Macronectes.sp.......Giant.petrel.sp..                 : int  0 0 0 0 0 0 0 0 3 0 ...
##  $ F..glacialis......Northern.fulmar.                     : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ D..capense......Cape.petrel.                           : int  1 0 0 0 0 0 0 0 0 0 ...
##  $ P..macroptera......Great.winged.petrel.                : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ P..feae......Fea.s.petrel.                             : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ P..incerta......Atlantic.petrel.                       : int  1 0 0 0 0 0 0 0 0 0 ...
##  $ P..arminjoniana......Trinidade.petrel.                 : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ P..mollis......Soft.plumaged.petrel.                   : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ B..bulwerii......Bulwer.s.petrel.                      : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ P..aequinoctialis......White.chinned.petrel.           : int  9 1 7 5 4 7 0 8 8 4 ...
##  $ P..conspicillata......Spectacled.petrel.               : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ Petrels......Petrel.sp..                               : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ Pachyptila.sp.......including.Halobaena.sp..           : int  0 0 0 0 0 0 0 1 0 0 ...
##  $ C..diomedea......Cory.s.shearwater.                    : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ C..edwardsii......Cape.Verde.shearwater.               : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ P..gravis......Great.shearwater.                       : int  38 29 32 22 297 17 5 8 0 3 ...
##  $ P..griseus......Sooty.shearwater.                      : int  0 0 0 0 0 0 0 0 0 2 ...
##  $ P..puffinus......Manx.shearwater.                      : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ P..mauretanicus......Balearic.shearwater.              : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ P..baroli......Macaronesian.shearwater.                : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ P..lherminieri......Audubon.s.shearwater.              : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ P..assimilis......Little.shearwater.                   : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ Shearwaters......Shearwater.sp..                       : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ O..oceanicus......Wilson.s.storm.petrel.               : int  1 4 0 4 3 0 0 2 2 1 ...
##  $ G..nereis......Grey.backed.storm.petrel.               : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ P..marina......White.faced.storm.petrel.               : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ F..grallaria......White.bellied.storm.petrel.          : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ O..castro......Madeiran.storm.petrel.                  : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ O..leucorhoa......Leach.s.storm.petrel.                : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ O..castro......including.Oceanodroma.leucorhoa.        : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ H..pelagicus......European.storm.petrel.               : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ Storm.petrels......Storm.petrel.sp..                   : int  0 0 2 0 0 0 0 0 0 0 ...
##  $ P..aethereus......Red.billed.tropicbird.               : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ P..lepturus......White.tailed.tropicbird.              : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ Tropicbirds......Tropicbird.sp..                       : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ F..aquila......Ascension.frigatebird.                  : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ F..magnificens......Magnificent.frigatebird.           : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ M..bassanus......Northern.gannet.                      : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ S..capensis......Cape.gannet.                          : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ S..sula......Red.footed.booby.                         : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ S..leucogaster......Brown.booby.                       : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ C..skua......Great.skua.                               : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ C..maccormicki......South.polar.skua.                  : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ C..antarctica......Antarctic.skua.                     : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ S..pomarinus......Pomarine.skua.                       : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ S..parasiticus......Arctic.skua.                       : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ S..longicaudus......Long.tailed.skua.                  : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ Skuas......Skua.sp..                                   : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ B..bernicla......Brent.goose.                          : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ G..arctica......Black.throated.diver.                  : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ P..capensis......Cape.cormorant.                       : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ P..coronatus......Crowned.cormorant.                   : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ P..carbo......Great.cormorant.                         : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ P..magellani......Magellanic.diving.petrel.            : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ Pelecanoides.sp.......Diving.petrel.sp..               : int  0 0 0 0 0 0 0 0 0 2 ...
##  $ P..fulicarius......Red.phalarope.                      : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ L..canus......Common.gull.                             : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ L..melanocephalus......Mediteranean.gull.              : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ L..argentatus......Herring.gull.                       : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ L..fuscus......Lesser.black.backed.gull.               : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ L..michahellis......Yellow.legged.gull.                : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ L..dominicanus......Cape.gull.                         : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ L..marinus......Great.black.backed.gull.               : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ L..ridibundus......Black.headed.gull.                  : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ L..minutus......Little.gull.                           : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ R..tridactyla......Black.legged.kittiwake.             : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ X..sabini......Sabine.s.gull.                          : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ Gulls......Gull.sp..                                   : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ S..hirundo......Common.tern.                           : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ S..arctica......Arctic.tern.                           : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ S..dougallii......Roseate.tern.                        : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ S..anaethetus......Bridled.tern.                       : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ S..fuscata......Sooty.tern.                            : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ S..sandvicensis......Sandwich.tern.                    : int  0 0 0 0 0 0 0 0 0 0 ...
##   [list output truncated]
High_Temp <- filter(polar, Temp...C...Mid.mean.surface.water.temper.... >= 23)
High_Temp
ID..Consecutive.number.of.transec…. Date.Time..Starting.time..UTC..of.30.min…. Latitude..Mid.latitude.of.30.min.transe…. Longitude..Mid.longitude.of.30.min.trans…. Bathy.depth..m…Mid.mean.water.depth.of.30.mi…. Speed..kn…Average.speed.of.the.vessel.d…. Distance..km…Distance.covered.during.30.mi…. Sal..Mid.mean.surface.salinity.of….. Temp…C…Mid.mean.surface.water.temper…. F.chl..µg.l…Mid.fluorescence.of.30.min.tr…. Zone..Zones..which.were.defined.on….. E..chrysocome……Rockhopper.penguin. S..magellanicus……Magellanic.penguin. Penguins……Penguin.sp.. T..melanophris……Black.browed.albatross. T..cauta……Shy.albatross. T..chlororhynchos……Atlantic.yellow.nosed.albatross. D..exulans……Wandering.albatross. D..dabbenena……Tristan.albatross. Diomedea.sp…….Great.albatrosses.sp.. D..epomophora……Southern.royal.albatross. D..sanfordi……Northern.royal.albatross. D..epomophora……including.Diomedea.sanfordi. Albatrosses……Albatross.sp.. M..giganteus……Southern.giant.petrel. Macronectes.sp…….Giant.petrel.sp.. F..glacialis……Northern.fulmar. D..capense……Cape.petrel. P..macroptera……Great.winged.petrel. P..feae……Fea.s.petrel. P..incerta……Atlantic.petrel. P..arminjoniana……Trinidade.petrel. P..mollis……Soft.plumaged.petrel. B..bulwerii……Bulwer.s.petrel. P..aequinoctialis……White.chinned.petrel. P..conspicillata……Spectacled.petrel. Petrels……Petrel.sp.. Pachyptila.sp…….including.Halobaena.sp.. C..diomedea……Cory.s.shearwater. C..edwardsii……Cape.Verde.shearwater. P..gravis……Great.shearwater. P..griseus……Sooty.shearwater. P..puffinus……Manx.shearwater. P..mauretanicus……Balearic.shearwater. P..baroli……Macaronesian.shearwater. P..lherminieri……Audubon.s.shearwater. P..assimilis……Little.shearwater. Shearwaters……Shearwater.sp.. O..oceanicus……Wilson.s.storm.petrel. G..nereis……Grey.backed.storm.petrel. P..marina……White.faced.storm.petrel. F..grallaria……White.bellied.storm.petrel. O..castro……Madeiran.storm.petrel. O..leucorhoa……Leach.s.storm.petrel. O..castro……including.Oceanodroma.leucorhoa. H..pelagicus……European.storm.petrel. Storm.petrels……Storm.petrel.sp.. P..aethereus……Red.billed.tropicbird. P..lepturus……White.tailed.tropicbird. Tropicbirds……Tropicbird.sp.. F..aquila……Ascension.frigatebird. F..magnificens……Magnificent.frigatebird. M..bassanus……Northern.gannet. S..capensis……Cape.gannet. S..sula……Red.footed.booby. S..leucogaster……Brown.booby. C..skua……Great.skua. C..maccormicki……South.polar.skua. C..antarctica……Antarctic.skua. S..pomarinus……Pomarine.skua. S..parasiticus……Arctic.skua. S..longicaudus……Long.tailed.skua. Skuas……Skua.sp.. B..bernicla……Brent.goose. G..arctica……Black.throated.diver. P..capensis……Cape.cormorant. P..coronatus……Crowned.cormorant. P..carbo……Great.cormorant. P..magellani……Magellanic.diving.petrel. Pelecanoides.sp…….Diving.petrel.sp.. P..fulicarius……Red.phalarope. L..canus……Common.gull. L..melanocephalus……Mediteranean.gull. L..argentatus……Herring.gull. L..fuscus……Lesser.black.backed.gull. L..michahellis……Yellow.legged.gull. L..dominicanus……Cape.gull. L..marinus……Great.black.backed.gull. L..ridibundus……Black.headed.gull. L..minutus……Little.gull. R..tridactyla……Black.legged.kittiwake. X..sabini……Sabine.s.gull. Gulls……Gull.sp.. S..hirundo……Common.tern. S..arctica……Arctic.tern. S..dougallii……Roseate.tern. S..anaethetus……Bridled.tern. S..fuscata……Sooty.tern. S..sandvicensis……Sandwich.tern. T..maximus……Royal.tern. C..niger……Black.tern. T..bergii……Crested.tern. Terns……Tern.sp.. A..stolidus……Brown.noddy. U..aalge……Guillemot. A..torda……Razorbill. Alcidae.sp…….Alcidae.sp.. Seabird.unident……Seabird..unidentified. P..catodon……Sperm.whale. M..novaeangliae……Humpback.whale. B..physalus……Fin.whale. B..borealis……Sei.whale. B..acutorostrata……Minke.whale. B..brydei……Bryde.s.whale. G..melas……Long.finned.pilot.whale. G..macrorhynchus……Short.finned.pilot.whale. Globicephala.sp…….Pilot.whale.sp.. Z..cavirostris……Cuvier.s.beaked.whale. Beaked.whale……Beaked.whale.sp.. Whale.unident……Whale..unidentified. O..orca……Killer.whale. L..australis……Peale.s.dolphin. L..albirostris……White.beacked.dolphin. Lagenorhynchus.sp…….Lagenorhynchus.sp.. D..delphis……Common.dolphin. S..frontalis……Atlantic.spotted.dolphin. S..coeruleoalba……Striped.dolphin. S..clymene……Clymene.dolphin. T..truncatus……Bottlenose.dolphin. G..griseus……Risso.s.dolphin. S..bredanensis……Rough.toothed.dolphin. S..longirostris……Spinner.dolphin. Dolphin.unident……Dolphin..unidentified. P..phocoena……Harbour.porpoise. A..pusillus……South.African.fur.seal. C..caretta……Loggerhead.sea.turtle. C..mydas……Green.sea.turtle. D..coriacea……Leatherback.sea.turtle. Sea.turtles……Sea.turtle.sp.. Manta.sp…….Manta.ray. Ray……Ray. Hammerhead.shark……Hammerhead.shark. Shark……Shark. Mola.mola……Sun.fish.
135 2012-04-18T14:00 -31.42 -39.43 4661 9.6 8.8896 35.8645 23.0101 3.02 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
143 2012-04-19T09:00 -28.98 -39.00 4330 10.6 9.8156 35.9608 24.6779 2.71 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
144 2012-04-19T09:30 -28.89 -39.00 4196 10.7 9.9082 36.1643 24.8572 2.82 8 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
145 2012-04-19T10:00 -28.80 -39.00 4068 10.6 9.8156 36.0574 24.7066 2.84 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
146 2012-04-19T10:30 -28.70 -39.00 3916 10.6 9.8156 35.9939 24.6284 2.84 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

polar %>% mutate(temp_high_23 = ifelse(Temp...C...Mid.mean.surface.water.temper.... >= 23, TRUE, FALSE)) %>% 
  filter(temp_high_23 ==TRUE) ##creating a new column that shows which temp are greater than 23 - makes a new column in order to do the same thing as the first code

Ejercicio 5

En este ejercicio, vas a manipular la estructura de datos “parrot”.

a) Elimina las especies que no tienen ocurrencias y también elimina la información que no vamos a utilizar: “longitud” (Longitude), “latitud” (Latitude) y “tiempo en minutos” (Time..min.).

b) Reemplaza los puntos en los nombres de especies por guiones utilizando la función str_replace().

c) Ahora que hemos manipulado la estructura de datos a nuestro gusto, crea un gráfico de barras (bar graph) visualizando la suma de abundancia para cada especie.

Haz clic aquí para solución!
parrot <- read.csv("parrot.csv")
head(parrot)
Longitude Latitude Code Time..min. Date.Time A..amazonica…. A..autumnalis…. A..barbadensis…. A..dufresniana…. A..farinosa…. A..festiva…. A..mercenaria…. A..ochrocephala….
-72.54740 10.31623 NM05 3 2010-03-15T11:13 0 0 0 0 0 0 0 0
-72.54267 10.31252 NM05 3 2010-03-15T11:06 0 0 0 0 0 0 0 0
-72.53757 10.31035 NM05 3 2010-03-15T10:59 0 0 0 0 0 0 0 0
-72.53145 10.30940 NM05 3 2010-03-15T10:54 0 0 0 0 0 0 0 0
-72.52523 10.30667 NM05 3 2010-03-15T10:46 0 0 0 0 0 0 0 0

parrot_clean_wrangle <- parrot %>%
  select(-`A..dufresniana....`, -`A..festiva....`, -`A..autumnalis....`, -`A..mercenaria....`) %>% 
  select(-Longitude, -Latitude, -`Time..min.`) %>% 
  rename(site = Code) 

colnames(parrot_clean_wrangle) <- str_replace(str_remove_all(colnames(parrot_clean_wrangle), "\\.\\.\\.\\."), "\\.\\.", "_")

head(parrot_clean_wrangle)
site Date.Time A_amazonica A_barbadensis A_farinosa A_ochrocephala
NM05 2010-03-15T11:13 0 0 0 0
NM05 2010-03-15T11:06 0 0 0 0
NM05 2010-03-15T10:59 0 0 0 0
NM05 2010-03-15T10:54 0 0 0 0
NM05 2010-03-15T10:46 0 0 0 0

parrot_clean_filter <- parrot_clean_wrangle %>% filter((A_amazonica != 0 | A_barbadensis != 0 | A_farinosa != 0 | A_ochrocephala != 0))

parrot_clean_filter %>%
   pivot_longer(names_to = "Species", values_to = "Abundance", A_amazonica:A_ochrocephala) %>%
  group_by(Species) %>%
  summarise(total_abundance = sum(Abundance)) %>%
  ggplot(aes(x = Species, y = total_abundance)) + geom_bar(stat = "identity")